package HashTable_08.DataStructure;

/*
 * @Author 罗
 * @date 2020/3/19 - 8:03 下午
 *
 */

import HashTable_08.entity.Employee;

public class EmpLinkedList {
    /*
     * HashTable中，链表不需要头节点，头节点就是第一个有效元素
     * */
    private Employee head;

    public void addOrderly(Employee employee) {
        if (head == null) {
            head = employee;
            return;
        }
        /*
         * 考虑到新添加的元素可能在头节点之前
         * */
        if (employee.id < head.id) {
            employee.next = head;
            head = employee;
            return;
        }

        Employee temp = head;
        while (true) {
            if (temp.next == null) {
//             已经抵达末尾，新添加的元素id是最大的，直接附加到末尾
                temp.next = employee;
                return;
            }
            if (temp.next.id > employee.id) {
                break;
            }
            temp = temp.next;
        }
        employee.next = temp.next;
        temp.next = employee;
    }

    /**
     * 通过id查找本链表中的雇员
     *
     * @param id
     * @return
     */
    public Employee findById(int id) {
        if (head == null) {
            System.err.println("本链表中数据为空");
            return null;
        }
        /*
         * find 直接查找本节点就行，如果是delete需要查找本节点的前一个节点
         *
         * */
        Employee temp = head;
        while (true) {
            if (temp == null) {
                System.err.println("已经抵达本链表结尾，但仍然未找到");
                return null;
            }
            if (temp.id == id) {
                return temp;
            }
            temp = temp.next;
        }

    }


    public void list(int i) {
        if (head == null) {
            System.out.println("第" + i + "条链表为空");
            return;
        } else {
            System.out.print("第" + i + "条链表中的数据 -->");
        }
        Employee temp = head;
        while (true) {
            if (temp == null) {
                break;
            }
            System.out.print(temp + "\t");
            temp = temp.next;
        }
        System.out.println();
    }

    public void delete(int id) {

        if (head == null) {
            System.err.println("链表中没有数据");
            return;
        }
        /*
         * 头节点含有数据，因此要特殊删除
         * */
        if (head.id == id) {
            head = null;
            System.out.println("删除完成，被删除的是头节点");
            return;
        }
        Employee temp = head;
        while (true) {

            if (temp.next == null) {
                break;
            }
            if (temp.next.id == id) {
                break;
            }
            temp = temp.next;
        }

        temp.next = temp.next.next;

    }

    /**
     * 假设添加雇员的时候，id是自增长，即id的添加顺序总是从小到大
     * 因此直接把雇员添加到链表的最后即可
     *
     * @param employee
     */
    public void add(Employee employee) {

        if (head == null) {
            head = employee;
            return;
        }
        Employee temp = head;
        while (true) {
            if (temp.next == null) {
                break;
            }
            temp = temp.next;
        }
        temp.next = employee;
    }


}
